package com.demo.common;

import com.demo.blog.Blog;
import com.demo.blog.BlogController;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.ext.handler.ContextPathHandler;
import com.jfinal.ext.plugin.shiro.ShiroInterceptor;
import com.jfinal.ext.plugin.shiro.ShiroPlugin;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.plugin.ehcache.EhCachePlugin;
import com.rm.system.index.IndexController;
import com.rm.system.model.Role;
import com.rm.system.model.User;

/**
 * API引导式配置
 */
public class DemoConfig extends JFinalConfig {
	Routes routes;

	/**
	 * 配置常量
	 */
	public void configConstant(Constants me) {
		// 加载少量必要配置，随后可用getProperty(...)获取值
		loadPropertyFile("a_little_config.txt");
		me.setDevMode(getPropertyToBoolean("devMode", false));
	}

	/**
	 * 配置路由
	 */
	public void configRoute(Routes me) {
		this.routes = me;
		me.add("/", IndexController.class, "/index"); // 第三个参数为该Controller的视图存放路径
		me.add("/blog", BlogController.class); // 第三个参数省略时默认与第一个参数值相同，在此即为
												// "/blog"
	}

	/**
	 * 配置插件
	 */
	public void configPlugin(Plugins me) {
		// 配置C3p0数据库连接池插件
		/**
		 * C3p0Plugin c3p0Plugin = new C3p0Plugin(getProperty("jdbcUrl"),
		 * getProperty("user"), getProperty("password").trim());
		 * me.add(c3p0Plugin);
		 * 
		 * // 配置ActiveRecord插件 ActiveRecordPlugin arp = new
		 * ActiveRecordPlugin(c3p0Plugin); me.add(arp); arp.addMapping("blog",
		 * Blog.class); // 映射blog 表到 Blog模型
		 **/

		C3p0Plugin cp = new C3p0Plugin("jdbc:oracle:thin:@127.0.0.1:1521:eai",
				"pwgh", "pwgh");
		// 配置Oracle驱动
		cp.setDriverClass("oracle.jdbc.driver.OracleDriver");
		me.add(cp);
		ActiveRecordPlugin arp2 = new ActiveRecordPlugin(cp);
		me.add(arp2);
		// 配置Oracle方言
		arp2.setDialect(new OracleDialect());
		// 配置属性名(字段名)大小写不敏感容器工厂
		arp2.setContainerFactory(new CaseInsensitiveContainerFactory());
		// arp.addMapping("user", "user_id", User.class);
		arp2.addMapping("blog", Blog.class); // 映射blog 表到 Blog模型
		arp2.addMapping("hly_org_employee", "userid", User.class); // 映射blog 表到
																	// Blog模型
		arp2.addMapping("hly_role", "roleid", Role.class); //

		me.add(new EhCachePlugin());
		// shiro权限框架
		me.add(new ShiroPlugin(routes));
	}

	/**
	 * 配置全局拦截器
	 */
	public void configInterceptor(Interceptors me) {
		// shiro 拦截器，判断是否符合访问权限
		//处理注解方式的权限控制
		me.add(new ShiroInterceptor());
		//处理数据库中配置的权限
		me.add(new com.rm.common.shiro.ShiroInterceptor());
	}

	/**
	 * 配置处理器
	 */
	public void configHandler(Handlers me) {
		me.add(new ContextPathHandler("basePath"));
	}

	/**
	 * 建议使用 JFinal 手册推荐的方式启动项目 运行此 main
	 * 方法可以启动项目，此main方法可以放置在任意的Class类定义中，不一定要放于此
	 */
	public static void main(String[] args) {
		JFinal.start("src/main/webapp", 80, "/", 5);
	}
}
